package pkg

import (
	"fmt"

	"github.com/rainyt/golib/util"
)

// 提交的文件数据总集
type FileData struct {
	Desc  string
	Name  string
	Files []*File
}

// 单个提交文件的数据
type File struct {
	Path  string
	Bytes *util.Bytes
}

// 解析数据
func (f *FileData) Parse(data []byte) error {
	bytes := &util.Bytes{
		Data: data,
	}
	// 仓库名称
	fmt.Println("解析数据总长度：", bytes.ByteLength())
	poolNameLen := bytes.ReadInt()
	fmt.Println("库名长度：", poolNameLen)
	fmt.Println("解析数据总长度：", bytes.ByteLength())
	if poolNameLen > bytes.ByteLength() {
		return fmt.Errorf("数据不合法：仓库名长度不足")
	}
	f.Name = bytes.ReadUTFString(poolNameLen)
	fmt.Println("库名：", f.Name)
	fmt.Println("解析数据总长度：", bytes.ByteLength())
	// 描述
	descLen := bytes.ReadInt()
	fmt.Println("解析数据总长度：", descLen, bytes.ByteLength())
	if descLen > bytes.ByteLength() {
		return fmt.Errorf("数据不合法：描述长度不足：" + fmt.Sprint(descLen) + " bytes.ByteLength()=" + fmt.Sprint(bytes.ByteLength()))
	}
	f.Desc = bytes.ReadUTFString(descLen)
	// 文件储存
	fileCounts := 0
	for {
		if bytes.ByteLength() <= 1 {
			break
		}
		file := &File{
			Bytes: util.CreateBytes(),
		}
		pathLen := bytes.ReadInt()
		file.Path = bytes.ReadUTFString(pathLen)
		fileSize := bytes.ReadUnsignedInt()
		if fileSize > bytes.ByteLength() {
			return fmt.Errorf("数据不合法：文件长度不足")
		}
		file.Bytes.Data = bytes.ReadBytes(fileSize)
		f.WriteFile(file)
		fileCounts++
	}
	if fileCounts == 0 {
		return fmt.Errorf("没有提交任何内容")
	}
	return nil
}

// 写入文件数据
func (f *FileData) WriteFile(file *File) {
	f.Files = append(f.Files, file)
}

// 获取交互数据
func (f *FileData) GetData() []byte {
	var data *util.Bytes = util.CreateBytes()
	// 仓库名称
	nameLen := len(f.Name)
	data.Write(nameLen)
	data.WriteString(f.Name)
	// 描述长度
	descLen := len(f.Desc)
	// 这里有长度限制，255
	if descLen > 255 {
		descLen = 255
	}
	data.Write(descLen)
	// 描述
	descBytes := []byte(f.Desc)
	data.WriteBytes(descBytes)
	// 文件循环
	for _, f2 := range f.Files {
		// 文件路径长度
		filePathLen := len(f2.Path)
		if filePathLen > 255 {
			filePathLen = 255
		}
		data.Write(filePathLen)
		// 文件路径
		data.WriteString(f2.Path)
		// 文件长度
		dataBytesLen := f2.Bytes.ByteLength()
		data.WriteUnsignedInt(dataBytesLen)
		// 文件二进制
		data.WriteBytes(f2.Bytes.Data)
		// 循环类推...
	}
	data.WriteString("\b")
	// - 结束
	//   - `\b`结束符
	return data.Data
}
